/** Keriosity, ESIR
 * 	Auto: classe gerant la connection wifi et le controller de la map
 *	@author: GOUYET Brett
 *	@date: 16/05/2012, deniere modif: 18/05 
 */

package keriosity.core;

import keriosity.activities.IAutoObserver;
import keriosity.connection.IWifiServer;
import keriosity.connection.WifiAuto;
import keriosity.map.IMap;
import keriosity.map.Map;
import org.osmdroid.util.GeoPoint;

import android.util.Log;


public class Auto implements IAuto{
	
	protected IAutoObserver _autoObserver = null;
	protected IWifiServer _connexionWifiAuto = null;
	protected IMap _map = null;
	protected GpsThread _gpsThread = null;
	
	
	/** CONSTRUCTEUR **/
	public Auto(IAutoObserver autoObserver){
		
		_autoObserver = autoObserver;
		_connexionWifiAuto = new WifiAuto(_autoObserver.getUrlOrder(), _autoObserver.getUrlGPS()); //connecteur wifi
		_map = new Map(_autoObserver.getMapView()); //controleur de la carte
		
		_map.moveKeriosity(new GeoPoint(48117561, -1636952)); //test
		//_map.moveKeriosity(new GeoPoint(53554300, -2959520));
	}
	
	
	/** Methode utiliser pour se connecter en wifi
	 * @param name: nom du robot sur le wifi
	 * @return vrai si on a reussit, faux sinon
	 */
	public boolean connectionWithWifi(String name){
		
		if(_connexionWifiAuto.connect(name)){ //+ "/comRSBP_Android")){		
			
			_gpsThread = new GpsThread(this, 4000);
			_gpsThread.setIsRunning(true); //on lance le thread
			_gpsThread.start();
			return true;
		}
		return false;
	}
		
	
	/** Methode envoyant un ordre a notre connexionCommand
	 * @param ordre : ordre a envoyer
	 * @return -1 si on erreur durant l'envoi, 1 si on est pas connecte, 
	 * 0 si ca a bien envoye
	 */
	public int send(boolean checked, String adrMail){
		
		GeoPoint destination = _map.getDestination(); //on recupere les coordonnees de la destination
		if(destination != null){
			
			//on cree l'ordre avec les coordonnes GPS et les infos de mission
    		String ordre = "lat="+ destination.getLatitudeE6() + "&lon=" + destination.getLongitudeE6() + "&pho=" + checked +"&adr="+ adrMail;    			
    		
    		//on envoi l'ordre et on traite les erreurs
    		if(! _connexionWifiAuto.send(ordre)){			
		
    			if(_connexionWifiAuto.isConnected())
    				return -1; //"Error during sending order"
    			else
    				return 1; //"Not connected" 
    		}
    		return 0; //pas d'erreur
		}
		return 2; //on pas selectionne de destination
	}
	
	
	/** Methode mettant a jour la position de Keriosity sur la carte **/
	public void getGPS(){
		
		try {
			_gpsThread.wait();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Log.i("auto", "getGPS");
		GeoPoint newPlacement = _connexionWifiAuto.getGPS(); //on recupere les coordonees GPS
				
		if(newPlacement != null)
			_map.moveKeriosity(newPlacement); //on deplace Keriosity	
		
		_gpsThread.notify();
	}
	
		
	/** Methode permettant de se deconnecter: coupe la connection et arrete le thread **/
	public void disconnect(){ 
    	
    	_connexionWifiAuto.disconnect(); //on arret la connection
    	if(_gpsThread != null){
    		_gpsThread.setIsRunning(false); //on arrete le thread
    		_gpsThread.interrupt();
    	}
    }


	/** Methodes du MapController **/
	public void clean(){_map.clean();}
	
	public void undo(){_map.undo();}
	
	public void find(){_map.find();}
}
